var io = require('socket.io').listen(8080, {log: false});
var conexoes = new Array();//vetor que contem todas as conexões de apresentacao

io.sockets.on('connection', function (socket) {    
    socket.emit('status', { hello: 'world' });
    socket.on('iniConexaoMaster', function (data) {//alguem quer criar uma nova apresentacao ela deve entao possuir um id, nao testado
        var conexaoComOMesmoIdApresentacao=null;//retorna, se existir, a conexao com o mesmo idApresentacao de data.idApresentacao
        var semIdRepetido=0;
        for(var i=0; i< conexoes.length; i++){//verifica se ja existe alguma apresentacao com um id igual a data.idApresentcao 
            if(conexoes[i].idApresentcao==data.idApresentcao){ 
                semIdRepetido=1;
                conexaoComOMesmoIdApresentacao=conexoes[i];
                break;                
            }
        }
        if(semIdRepetido==0){//nao ha apresentacao com um data.idApresentcao igual a este
            var dadosConexao={//dados da conexao que cria uma apresentacao
                idApresentcao: data.idApresentcao,//id da apresentacao
                sockets: new Array(),//sockets que existem na apresentacao       
                senha: data.senha, //senha, ela e chave que permite ao mestre controlar a apresentacao
                                  //para que ninguem se passe por mestre
                gerIdCon:0,  //gera um id para cada conexao da apresentacao com determinado data.idApresentcao,               
                            //isto e feito incremento em +1 o gerIdCon toda vez que uma conexao mestre com 
                            //um mesmo idApresentaca passa pelo else if mais abaixo
	       idsCon: new Array() //vetor com os ids de todos as conexoes que existem, seu tamanho e o
	                           //mesmo que o tamanho do vetor sockets
            };            
            
            dadosConexao.sockets.push(socket);
	    dadosConexao.idsCon.push(dadosConexao.gerIdCon);
            conexoes.push(dadosConexao);    
            socket.emit('sucessoConexao', {idCon: dadosConexao.gerIdCon, nConexoes: dadosConexao.gerIdCon+1});	    
	    broadCastConexaoApresentacao('novaConexao', {idApresentcao: data.idApresentcao, senha: data.senha, idCon: dadosConexao.gerIdCon});
         
        }
        else if( data.senha==conexoes[i].senha){//ja existe uma apresentacao aberta no servidor e o computador que 
                                                //esta se conectando agora tem poder de master sobre ela, pq ele tem a 
                                                //senha dela
                                                
            conexaoComOMesmoIdApresentacao.sockets.push(socket);
	    conexaoComOMesmoIdApresentacao.gerIdCon=conexaoComOMesmoIdApresentacao.gerIdCon+1;
	    conexaoComOMesmoIdApresentacao.idsCon.push(conexaoComOMesmoIdApresentacao.gerIdCon);
            socket.emit('sucessoConexao', {idCon: conexaoComOMesmoIdApresentacao.gerIdCon,  nConexoes: conexaoComOMesmoIdApresentacao.gerIdCon+1});	    
	    broadCastConexaoApresentacao('novaConexao', {idApresentcao: data.idApresentcao, senha: data.senha, idCon: conexaoComOMesmoIdApresentacao.gerIdCon});
        }
        else{
            socket.emit('falhaConexao', {});
            delete socket;
        }        
    });
    
    socket.on('iniConexaoSlave', function (data) {
        var conexaoAbertaPeloMAster=0;
        var conexao=null;
        for(var i=0; i< conexoes.length; i++){//verifica se ja existe alguma apresentacao com id igual a data.idApresentcao 
            if(conexoes[i].idApresentcao==data.idApresentcao){ 
                conexao=conexoes[i];
                conexaoAbertaPeloMAster=1;
                break;                
            }
        }
    
        if(conexaoAbertaPeloMAster==1){            
            conexao.sockets.push(socket);            
            socket.emit('sucessoConexao', {});            
        }        
        else{
            socket.emit('falhaConexao', {});      
            delete socket;        
        }        
    });
    socket.on('mandarPontoMouseMestre', function (data) {
        broadCastConexaoApresentacao('mandarPontoMouseEscravo',data);
    });
    socket.on('resetarPontoMestre', function (data) {
        broadCastConexaoApresentacao('resetarPontoEscravo', data);
    });
    socket.on('slideMestre', function (data) {
        broadCastConexaoApresentacao('slideEscravo', data);
    });
    socket.on('controlLozaMestre', function (data) {
        broadCastConexaoApresentacao('controlLozaEscravo', data);
    });
    socket.on('limparLozaMestre', function (data) {
        broadCastConexaoApresentacao('limparLozaEscravo', data);
    });
    socket.on('mandarPontoCursorMouseMestre', function (data) {        
        broadCastConexaoApresentacao('mandarPontoCursorMouseEscravo', data);
    });
    socket.on('mandarModoBorrachaMestre', function (data) {        
        broadCastConexaoApresentacao('mandarModoBorrachaEscravo', data);
    });
    
    socket.on('disconnect',function(data){//tira os sockets desconectados do programa
	var idCon=-1;
	var senha="";
	var idApresentcao="";
	var condAchou=0;
        for(var i=0; i< conexoes.length; i++){
            conexaoApresentacao=conexoes[i];//pega a conexaoApresentacao, presente no vetor conexoes, a que o socket.id esta associado
            for(var j=0; j< conexaoApresentacao.sockets.length;j++){
                if(conexaoApresentacao.sockets[j].id==socket.id){                                         
		    idCon=conexaoApresentacao.idsCon[j];
		    senha=conexaoApresentacao.senha;
		    idApresentcao=conexaoApresentacao.idApresentcao;
                    conexaoApresentacao.sockets=apagarElementoVetor(conexaoApresentacao.sockets,j);//apaga da lista  conexaoApresentacao.sockets o socket com um socket.id= conexaoApresentacao.idsSockets[j].id
		    conexaoApresentacao.idsCon=apagarElementoVetor(conexaoApresentacao.idsCon,j);//apaga da lista  conexaoApresentacao.idsCon o elemento na posicao j		    
                    delete socket;
                    if(conexaoApresentacao.sockets.length==0){
                        conexoes=apagarElementoVetor(conexoes,i);
                    }
                    condAchou=1;
                    break;
                }                
            }
            if(condAchou==1) break;
        }
        if(idCon!=-1){
	    broadCastConexaoApresentacao('alguemDisconectou', {idCon:idCon, senha:senha, idApresentcao:idApresentcao});
	    
	}
    });
    
});    
function apagarElementoVetor(vet, nelemento){
    var ret = new Array();
    for(var i=0; i< vet.length;i++){
        if(nelemento!=i){
            ret.push(vet[i]);    
        }
    }
    return ret;
}
function broadCastConexaoApresentacao( rotuloMsg, data){
    var conexaoApresentacao=getConexaoApresentacao(data);
    if(conexaoApresentacao!=null && conexaoApresentacao.senha==data.senha){
        var sockets=conexaoApresentacao.sockets;
        for(var i=0; i< sockets.length; i++){
            sockets[i].emit(rotuloMsg, data);            
        }
        
    }
}
function getConexaoApresentacao(data){
    for(var i=0; i< conexoes.length; i++){
        if(conexoes[i].idApresentcao==data.idApresentcao){ 
            return conexoes[i];
        }        
    }
    return null;
}
